#ifndef SEMANTICO_H_INCLUDED
#define SEMANTICO_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "tabeladeSimbolos.h"
#include "ASA.h"
#include "analex.h"
#include "escopoSemantico.h"

#define MAIORCOMPRIMENTOINTEIRO 21
#define TAMANHO_COMP_TOKENS 30

GerenciaEscopo* retornaEscopoSemantico();

class Visita_Semantico: public Visitante{
    public:
        Visita_Semantico();
        void visitar(_Program *v);
        void visitar(_Block *v);
        void visitar(_SubProgram_List *v);
        void visitar(_SubPrograma* v);
        void visitar(_Var_List *v);
        void visitar(_Type *v);
        void visitar(_Type_List *v);
        void visitar(_Statement_List *v);
        void visitar(_Statement *v);
        void visitar(_Primary *v);
        void visitar(_If *v);
        void visitar(_While *v);
        void visitar(_Select *v);
        void visitar(_Break *v);
        void visitar(_Write *v);
        void visitar(_Read *v);
        void visitar(_CaseBlock *v);
        void visitar(_Exp_List *v);
        void visitar(_Exp *v);
        void visitar(_Assign *v);
        _Type* visitar(_Name *v);
        _Type* visitar(_Call *v);
        _Type* visitar(_Relational_Op *v);
        _Type* visitar(_Addition_Op *v);
        _Type* visitar(_Multiplication_Op *v);
        _Type* visitar(_Sign *v);
        _Type* visitar(_ID *v);
        _Type* visitar(_Number *v);
        _Type* visitar(_Literal *v);
        _Type* visitar(_Boolean_Op *v);
        _Type* visitar(_True *v);
        _Type* visitar(_False *v);
        ~Visita_Semantico();
};


#endif // SEMANTICO_H_INCLUDED

